home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume6 / bday next >
Encoding:
Text File  |  1989-05-14  |  17.1 KB  |  585 lines

  1. Newsgroups: comp.sources.misc
  2. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  3. Subject: v06i099: Happy birthday to you...
  4. Reply-To: rsalz@bbn.com (Rich Salz)
  5.  
  6. Posting-number: Volume 6, Issue 99
  7. Submitted-by: rsalz@bbn.com (Rich Salz)
  8. Archive-name: bday
  9.  
  10.  
  11. There used to be a machine called oz.ai.mit.edu, and it used to have a
  12. wizard who knew when it was your birthday.  He was a friendly wizard, not
  13. at all deserving of the name "daemon," because he'd send you a nice little
  14. note when that special day came around...
  15.  
  16. I had been saving one of my messages for some time, but only just now got
  17. around to writing this program.  It reads a file with email names and
  18. birthdays, and sends mail.  It should be run out of cron early every
  19. morning.  If WEEKEND_HACK is #define'd, then on Friday bday will send mail
  20. to people with birthdays on Saturday and Sunday.
  21.  
  22. The program uses getopt and sendmail, but hacking around the latter should
  23. be pretty easy.
  24.  
  25.     /rich $alz
  26.  
  27. #! /bin/sh
  28. # This is a shell archive.  Remove anything before this line, then unpack
  29. # it by saving it into a file and typing "sh file".  To overwrite existing
  30. # files, type "sh file -c".  You can also feed this as standard input via
  31. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  32. # will see the following message at the end:
  33. #        "End of archive 1 (of 1)."
  34. # Contents:  MANIFEST Makefile README bday.8 bday.c bdaylist bdaymesg
  35. # Wrapped by rsalz@papaya.bbn.com on Mon May  8 11:17:21 1989
  36. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  37. if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  38.   echo shar: Will not clobber existing file \"'MANIFEST'\"
  39. else
  40. echo shar: Extracting \"'MANIFEST'\" \(459 characters\)
  41. sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
  42. X   File Name        Archive #    Description
  43. X-----------------------------------------------------------
  44. X MANIFEST                   1    This shipping list
  45. X Makefile                   1    Makefile for birthday greetings
  46. X README                     1    Random stuff
  47. X bday.8                     1    Manual page
  48. X bday.c                     1    Send birthday greetings to users
  49. X bdaylist                   1    Control file for bday
  50. X bdaymesg                   1    Message file for bday
  51. END_OF_FILE
  52. if test 459 -ne `wc -c <'MANIFEST'`; then
  53.     echo shar: \"'MANIFEST'\" unpacked with wrong size!
  54. fi
  55. # end of 'MANIFEST'
  56. fi
  57. if test -f 'Makefile' -a "${1}" != "-c" ; then 
  58.   echo shar: Will not clobber existing file \"'Makefile'\"
  59. else
  60. echo shar: Extracting \"'Makefile'\" \(489 characters\)
  61. sed "s/^X//" >'Makefile' <<'END_OF_FILE'
  62. X##
  63. X##  Makefile for birthday greetings.
  64. X##  Written by Rich $alz, <rsalz@bbn.com>.  This package has no copyright.
  65. X##  $Header: Makefile,v 1.1 89/05/08 11:07:14 rsalz Exp $
  66. X##
  67. X
  68. XCFLAGS    = -O
  69. X
  70. Xall:        bday bday.8
  71. X
  72. Xinstall:    all
  73. X    @echo "Install according to local convention"
  74. X
  75. Xclean:
  76. X    rm -f foo core SHAR tags lint a.out *.o bday
  77. X
  78. Xbday:        bday.c
  79. X    @rm -f bday
  80. X    $(CC) -o bday $(CFLAGS) bday.c
  81. X
  82. X##  I know it fits in one kit, so...
  83. Xkit:
  84. X    @rm -f SHAR
  85. X    makekit -m
  86. X    @rm -f MANIFEST.BAK
  87. X    @mv Part01 SHAR
  88. END_OF_FILE
  89. if test 489 -ne `wc -c <'Makefile'`; then
  90.     echo shar: \"'Makefile'\" unpacked with wrong size!
  91. fi
  92. # end of 'Makefile'
  93. fi
  94. if test -f 'README' -a "${1}" != "-c" ; then 
  95.   echo shar: Will not clobber existing file \"'README'\"
  96. else
  97. echo shar: Extracting \"'README'\" \(699 characters\)
  98. sed "s/^X//" >'README' <<'END_OF_FILE'
  99. X
  100. XThere used to be a machine called oz.ai.mit.edu, and it used to have a
  101. Xwizard who knew when it was your birthday.  He was a friendly wizard, not
  102. Xat all deserving of the name "daemon," because he'd send you a nice little
  103. Xnote when that special day came around...
  104. X
  105. XI had been saving one of my messages for some time, but only just now got
  106. Xaround to writing this program.  It reads a file with email names and
  107. Xbirthdays, and sends mail.  It should be run out of cron early every
  108. Xmorning.  If WEEKEND_HACK is #define'd, then on Friday bday will send mail
  109. Xto people with birthdays on Saturday and Sunday.
  110. X
  111. XThe program uses getopt and sendmail, but hacking around the latter should
  112. Xbe pretty easy.
  113. X
  114. X    /r$
  115. END_OF_FILE
  116. if test 699 -ne `wc -c <'README'`; then
  117.     echo shar: \"'README'\" unpacked with wrong size!
  118. fi
  119. # end of 'README'
  120. fi
  121. if test -f 'bday.8' -a "${1}" != "-c" ; then 
  122.   echo shar: Will not clobber existing file \"'bday.8'\"
  123. else
  124. echo shar: Extracting \"'bday.8'\" \(1936 characters\)
  125. sed "s/^X//" >'bday.8' <<'END_OF_FILE'
  126. X.\" $Header: bday.8,v 1.1 89/05/08 11:07:38 rsalz Exp $"
  127. X.TH BDAY 8
  128. X.SH NAME
  129. Xbday \- birthday daemon
  130. X.SH SYNOPSIS
  131. X.B bday
  132. X[
  133. X.BI \-b birthdays
  134. X] [
  135. X.BI \-m message
  136. X] [
  137. X.BI \-r report_to
  138. X] [
  139. X.BI \-s sendmail_cmd
  140. X]
  141. X.SH DESCRIPTION
  142. X.I Bday
  143. Xis a program intended to be run every day out of
  144. X.IR cron (1).
  145. XIt reads a file containing a list of user names and birthdays,
  146. Xand sends a message to anyone whose birthday is today.
  147. XThe ``\-r'' option may be used to specify a person who should receive
  148. Xa report whenever a greeting is sent.
  149. X.PP
  150. XThe ``\-b'' option may be used to specify the file containing the list
  151. Xof people's birthdays; the default is
  152. X.IR /usr/adm/bdaylist .
  153. XThis file should consist of a series of lines of three fields, each separated
  154. Xby whitespace:
  155. X.RS
  156. X.nf
  157. X.ta \w'#emailname   'u +\w'month   'u
  158. X#emailname    month    day
  159. Xrsalz    2    10
  160. X.fi
  161. X.RE
  162. XThe first column is the name of the person to send the email message to.
  163. XThe second column is the month in which the person's birthday occurs;
  164. X1 is for January, and so on up to 12 for December.
  165. XThe third column is the day of the month on which their birthday occurs.
  166. XBlank lines, and any text after a pound sign is ignored.
  167. X.PP
  168. XThe ``\-m'' option may be used to specify the file with the birthday message;
  169. Xthe default is
  170. X.IR /usr/adm/bdaymesg .
  171. XThis is useful, for example, to send different greetings to people who's
  172. Xbirthday falls on a weekend.
  173. X.PP
  174. XThe command used to send the mail may be changed by giving the ``\-s''
  175. Xoption; this is useful for debugging.
  176. XNote that the details of sending the message (such as the mail headers)
  177. Xare compiled into the code, but that's okay because this is just a short
  178. Xfun hack, anyhow.
  179. X.SH AUTHOR
  180. XWritten by Rich $alz, <rsalz@bbn.com>, after receiving just such a message
  181. Xfrom one of the machine at MIT.  This package has no copyright.
  182. X.SH FILES
  183. X.ta \w'/usr/adm/bdaylist   'u
  184. X/usr/adm/bdaylist    Default birthday list
  185. X/usr/adm/bdaymesg    Default birthday message
  186. END_OF_FILE
  187. if test 1936 -ne `wc -c <'bday.8'`; then
  188.     echo shar: \"'bday.8'\" unpacked with wrong size!
  189. fi
  190. # end of 'bday.8'
  191. fi
  192. if test -f 'bday.c' -a "${1}" != "-c" ; then 
  193.   echo shar: Will not clobber existing file \"'bday.c'\"
  194. else
  195. echo shar: Extracting \"'bday.c'\" \(6081 characters\)
  196. sed "s/^X//" >'bday.c' <<'END_OF_FILE'
  197. X/*
  198. X**  When you care enough to send the very best....
  199. X**  Written by Rich $alz, <rsalz@bbn.com>, after seeing the MIT program
  200. X**  in action.  This package has no copyright.
  201. X*/
  202. X#include <stdio.h>
  203. X#include <ctype.h>
  204. X#include <sys/types.h>
  205. X#include <time.h>
  206. X#include <fcntl.h>
  207. X#include <sgtty.h>
  208. X#ifndef    lint
  209. X#ifndef    SABER
  210. Xstatic char RCS[] =
  211. X    "$Header: bday.c,v 1.1 89/05/08 11:13:22 rsalz Exp $";
  212. X#endif    /* SABER */
  213. X#endif    /* lint */
  214. X
  215. X/* Compilation control. */
  216. X#define STRCHR        strchr        /* Maybe index            */
  217. X#define STRRCHR        strrchr        /* Maybe rindex            */
  218. X#undef WEEKEND_HACK            /* Work harder on Friday?    */
  219. X
  220. X/* Manifest constants. */
  221. X#define TRUE        1
  222. X#define FALSE        0
  223. X#define LEN        128
  224. X#define FROM        "The Birthday Wizard <wizard@pineapple.bbn.com>"
  225. X
  226. X/* Syntactic sugar. */
  227. X#define WHITE(c)    ((c) == ' ' || (c) == '\t')
  228. X#define Fprintf        (void)fprintf
  229. X#ifdef    lint
  230. X#undef    putc
  231. X#endif    /* lint */
  232. X
  233. X
  234. X/* Global data. */
  235. Xstatic char    *progname;
  236. Xstatic char    *ReportTo    = NULL;
  237. Xstatic char    *Birthdays    = "/usr/adm/bdaylist";
  238. Xstatic char    *Message    = "/usr/adm/bdaymesg";
  239. Xstatic char    *sendmail    = "/usr/lib/sendmail.sun -t -oi";
  240. X/*static char    *sendmail    = "/usr/lib/sendmail -t -oi"; */
  241. X
  242. X
  243. X/* Linked in later. */
  244. Xextern int     errno;
  245. Xextern char    *optarg;
  246. Xextern time_t     time();
  247. Xextern char    *sprintf();        /* Too painful, my ass        */
  248. Xextern char    *strcpy();
  249. Xextern char    *STRCHR();
  250. Xextern char    *STRRCHR();
  251. X
  252. X
  253. X/*
  254. X**  Return the text string that corresponds to errno.
  255. X*/
  256. Xstatic char *
  257. Xstrerror(e)
  258. X    int         e;
  259. X{
  260. X    extern int     sys_nerr;
  261. X    extern char    *sys_errlist[];
  262. X    static char     buff[30];
  263. X
  264. X    if (e > 0 && e < sys_nerr)
  265. X    return sys_errlist[e];
  266. X    (void)sprintf(buff, "Error code %d", e);
  267. X    return buff;
  268. X}
  269. X
  270. X
  271. X/*
  272. X**  Send mail to the person.
  273. X*/
  274. Xstatic void
  275. XDoit(Name)
  276. X    char    *Name;
  277. X{
  278. X    register FILE    *F;
  279. X    register FILE    *M;
  280. X    register int     c;
  281. X
  282. X    /* Prep the pipe. */
  283. X    if ((F = popen(sendmail, "w")) == NULL) {
  284. X    Fprintf(stderr, "%s: Doit(%s) failed to popen \"%s\", %s.\n",
  285. X        progname, Name, sendmail, strerror(errno));
  286. X    return;
  287. X    }
  288. X
  289. X    /* Write headers. */
  290. X    Fprintf(F, "From: %s\n", FROM);
  291. X    Fprintf(F, "To: %s\n", Name);
  292. X    Fprintf(F, "Subject: Happy birthday!\n");
  293. X    Fprintf(F, "\n");
  294. X
  295. X    /* Feed in the message. */
  296. X    if (M = fopen(Message, "r")) {
  297. X    while ((c = getc(M)) != EOF)
  298. X        (void)putc(c, F);
  299. X    (void)fclose(M);
  300. X    }
  301. X
  302. X    /* Close up.  Done? */
  303. X    (void)pclose(F);
  304. X    if (ReportTo == NULL)
  305. X    return;
  306. X
  307. X    /* Report it. */
  308. X    if ((F = popen(sendmail, "w")) == NULL) {
  309. X    Fprintf(stderr, "%s: Doit(%s) couldn't report, %s.\n",
  310. X        progname, Name, strerror(errno));
  311. X    return;
  312. X    }
  313. X
  314. X    /* Write the report. */
  315. X    Fprintf(F, "To: %s\n", ReportTo);
  316. X    Fprintf(F, "Subject: Greetings sent\n");
  317. X    Fprintf(F, "\n");
  318. X    Fprintf(F, "Sent a message to %s.\n", Name);
  319. X
  320. X    /* Close up.  Definitely done. */
  321. X    (void)pclose(F);
  322. X}
  323. X
  324. X
  325. X/*
  326. X**  Return pointer to first non-whitespace.
  327. X*/
  328. Xstatic char *
  329. XSkip(p)
  330. X    register char    *p;
  331. X{
  332. X    while (*p && WHITE(*p))
  333. X    p++;
  334. X    return p;
  335. X}
  336. X
  337. X
  338. X/*
  339. X**  Check the list in the file for birthdays.
  340. X*/
  341. Xstatic void
  342. XScanForWork(ThisMonth, ThisDay)
  343. X    int             ThisMonth;
  344. X    int             ThisDay;
  345. X{
  346. X    register FILE    *F;
  347. X    register char    *p;
  348. X    int             UserMonth;
  349. X    int             UserDay;
  350. X    char         UserName[LEN];
  351. X    char         buff[LEN];
  352. X
  353. X    /* Open the list of birthdays. */
  354. X    if ((F = fopen(Birthdays, "r")) == NULL) {
  355. X    Fprintf(stderr, "%s: ScanForWork can't open \"%s\" for reading, %s.\n",
  356. X        progname, Birthdays, strerror(errno));
  357. X    return;
  358. X    }
  359. X
  360. X    /* Scan all lines. */
  361. X    while (fgets(buff, sizeof buff, F)) {
  362. X    /* Clobber comment markers and newlines. */
  363. X    if (p = STRCHR(buff, '#'))
  364. X        *p = '\0';
  365. X    if (p = STRCHR(buff, '\n'))
  366. X        *p = '\0';
  367. X
  368. X    /* Skip blank or comment lines. */
  369. X    if (buff[0] == '\0')
  370. X        continue;
  371. X
  372. X    /* First field is the user name. */
  373. X    for (p = buff; *p && !WHITE(*p); p++)
  374. X        ;
  375. X    *p++ = '\0';
  376. X    (void)strcpy(UserName, buff);
  377. X    if (UserName[0] == '\0')
  378. X        continue;
  379. X
  380. X    /* Second field is the month of the user's birthday. */
  381. X    p = Skip(p);
  382. X    if (*p == '\0')
  383. X        continue;
  384. X    for (UserMonth = atoi(p); *p && isdigit(*p); p++)
  385. X        ;
  386. X    if (UserMonth == 0)
  387. X        continue;
  388. X
  389. X    /* Third field is the date of the user's birthday. */
  390. X    p = Skip(p);
  391. X    if (*p == '\0')
  392. X        continue;
  393. X    UserDay = atoi(p);
  394. X    if (UserDay == 0)
  395. X        continue;
  396. X
  397. X    /* Is this one for us? */
  398. X    if (UserMonth == ThisMonth && UserDay == ThisDay)
  399. X        Doit(UserName);
  400. X    }
  401. X
  402. X    (void)fclose(F);
  403. X}
  404. X
  405. X
  406. X/*
  407. X**  Make sure the file was specified and is readable.
  408. X*/
  409. Xstatic void
  410. XCheckFile(Name, Purpose)
  411. X    char    *Name;
  412. X    char    *Purpose;
  413. X{
  414. X    FILE    *F;
  415. X
  416. X    if (Name == NULL) {
  417. X    Fprintf(stderr, "%s:  No %s file given.\n", progname, Purpose);
  418. X    exit(1);
  419. X    }
  420. X
  421. X    if ((F = fopen(Name, "r")) == NULL) {
  422. X    Fprintf(stderr, "%s: Can't open \"%s\" for %s, %s.\n",
  423. X        progname, Name, Purpose, strerror(errno));
  424. X    exit(1);
  425. X    }
  426. X
  427. X    (void)fclose(F);
  428. X}
  429. X
  430. X
  431. Xmain(ac, av)
  432. X    int         ac;
  433. X    char    *av[];
  434. X{
  435. X    int         i;
  436. X    time_t     t;
  437. X    struct tm    *tm;
  438. X    char    *p;
  439. X
  440. X    /* Parse JCL. */
  441. X    progname = (p = STRRCHR(av[0], '/')) ? p + 1 : av[0];
  442. X    while ((i = getopt(ac, av, "b:m:r:s:")) != EOF)
  443. X    switch (i) {
  444. X    default:
  445. X        Fprintf(stderr, "Usage:\n\t%s %s\n",
  446. X            progname,
  447. X            "[-b list] [-m message] [-s sendcmd] [-r admin]");
  448. X        exit(1);
  449. X    case 'b':
  450. X        Birthdays = optarg;
  451. X        break;
  452. X    case 'm':
  453. X        Message = optarg;
  454. X        break;
  455. X    case 'r':
  456. X        ReportTo = optarg;
  457. X        break;
  458. X    case 's':
  459. X        sendmail = optarg;
  460. X        break;
  461. X    }
  462. X
  463. X    /* Make sure the user gave us readable files. */
  464. X    CheckFile(Birthdays, "birthday list");
  465. X    CheckFile(Message, "message");
  466. X
  467. X    /* What time is it? */
  468. X    t = time((time_t *)NULL);
  469. X    tm = localtime(&t);
  470. X    ScanForWork(tm->tm_mon + 1, tm->tm_mday);
  471. X
  472. X#ifdef    WEEKEND_HACK
  473. X    /* If it's Friday, check for Saturday and Sunday birthdays. */
  474. X    if (tm->tm_wday == 5) {
  475. X    /* This is easy/sleazy, we avoid checking for end of month... */
  476. X    t += 24 * 60 * 60;
  477. X    tm = localtime(&t);
  478. X    ScanForWork(tm->tm_mon + 1, tm->tm_mday);
  479. X    t += 24 * 60 * 60;
  480. X    tm = localtime(&t);
  481. X    ScanForWork(tm->tm_mon + 1, tm->tm_mday);
  482. X    }
  483. X#endif    /* WEEKEND_HACK */
  484. X
  485. X    exit(0);
  486. X}
  487. END_OF_FILE
  488. if test 6081 -ne `wc -c <'bday.c'`; then
  489.     echo shar: \"'bday.c'\" unpacked with wrong size!
  490. fi
  491. # end of 'bday.c'
  492. fi
  493. if test -f 'bdaylist' -a "${1}" != "-c" ; then 
  494.   echo shar: Will not clobber existing file \"'bdaylist'\"
  495. else
  496. echo shar: Extracting \"'bdaylist'\" \(227 characters\)
  497. sed "s/^X//" >'bdaylist' <<'END_OF_FILE'
  498. X##  Data file for birthday program.  Written by rsalz@bbn.com; this package
  499. X##  has no copyright.
  500. X##  $Header: bdaylist,v 1.1 89/05/08 11:07:48 rsalz Exp $
  501. X##  Data lines look like this:
  502. X##email            month    day
  503. Xrsalz@bbn.com        2    10
  504. END_OF_FILE
  505. if test 227 -ne `wc -c <'bdaylist'`; then
  506.     echo shar: \"'bdaylist'\" unpacked with wrong size!
  507. fi
  508. # end of 'bdaylist'
  509. fi
  510. if test -f 'bdaymesg' -a "${1}" != "-c" ; then 
  511.   echo shar: Will not clobber existing file \"'bdaymesg'\"
  512. else
  513. echo shar: Extracting \"'bdaymesg'\" \(2880 characters\)
  514. sed "s/^X//" >'bdaymesg' <<'END_OF_FILE'
  515. X
  516. X                                               YY
  517. X                                              YYYY            YY
  518. XHHHHH         HHHHH                             YYY          YYYY
  519. XHHHHH         HHHHH                  PP PPPPPP   YYY         YYY
  520. X  HHH         HHH                     PPP    PP   YYY       YYY
  521. X  HHH         HHH    AAAAA  PP PPPPPP  PP    PP    YYY     YYY
  522. X  HHH         HHH   AAAAAAA  PPP    PP PP    PP     YYY   YYY
  523. X  HHH         HHH  AA     AA  PP    PP PP    PP      YYY YYY
  524. X  HHH         HHH  AA     AA  PP    PP PPPPPPP        YYYYY
  525. X  HHHHHHHHHHHHHHH  AA     AA  PP    PP PP             YYYY
  526. X  HHHHHHHHHHHHHHH  AA     AA  PPPPPPP  PP            YYYY   -------
  527. X  HHHHHHHHHHHHHHH  AAAAAAAAA  PP       PP           YYYY    -------
  528. X  HHH         HHH  AAAAAAAAA  PP       PP          YYYY     -------
  529. X  HHH         HHH  AA     AA  PP       PP         YYYY
  530. X  HHH         HHH  AA     AA  PP       PP        YYYY
  531. X  HHH         HHH  AA     AA  PP       PP      YYYYYY
  532. X  HHH         HHH  AA     AA  PP       PP     YYYYYYY
  533. X  HHH         HHH             PP       PP    YYYYYYY
  534. XHHHHH         HHHHH           PP       PP   YYYYYYY
  535. XHHHHH         HHHHH           PP       PP  YYYYYYY
  536. X                                            YYYYY
  537. XBBBBBBBBBBBBB                                YYY
  538. XBBBBBBBBBBBBBB                                Y
  539. X BBBB       BBB    II                                   YYY             YYY
  540. X  BB         BB    II               DDDDDDDDDDDDD       YYYY           YYYY
  541. X  BB         BB                     DDDDDDDDDDDDDD        YY            YY
  542. X  BB         BB   III  RRR RRRR        DDD      DDD      A YY          YY
  543. X  BB         BB    II   RRRR  RR       DDD      DDD     AAA YY        YY
  544. X  BB        BBB    II    RRR           DDD      DDD    AAAAA YY      YY
  545. X  BBB     BBBB     II    RR            DDD      DDD   AAAAAAA YY    YY
  546. X  BBBBBBBBBBB      II    RR            DDD      DDD  AA     AA YY  YY
  547. X  BBBBBBBBB        II    RR            DDD      DDD  AA     AA  YYYY
  548. X  BBBBBBBBBBB      II    RR            DDD      DDD  AAAAAAAAA   YYY
  549. X  BBB     BBBB    IIII  RRRR           DDD      DDD  AAAAAAAAA   YYY
  550. X  BB        BBB             HHH        DDD      DDD  AA     AA   YYY
  551. X  BB         BBB    TT     HHHH        DDD      DDD  AA     AA   YYY
  552. X  BB         BBB    TT     HH          DDD      DDD  AA     AA   YYY
  553. X  BB          BBB TTTTTT   HH          DDD      DDD  AA     AA   YYY
  554. X  BB          BBB   TT     HH          DDD      DDD              YYY
  555. X  BB          BBB   TT     HHHHHHHH  DDDDDDDDDDDDD               YYY
  556. X  BB         BBB    TT     HH     HH DDDDDDDDDDDD               YYYY
  557. X BBBB       BBBB    TT     HH     HH                           YYYY
  558. XBBBBBBBBBBBBBBB     TT  TT HH     HH    YYYYYYYYYYYYYYYYYYYYYYYYYY
  559. XBBBBBBBBBBBBBB       TTTT  HH     HH    YYYYYYYYYYYYYYYYYYYYYYYY
  560. X                          HHHH   HHHH   YYYYYYYYYYYYYYYYYYYYYY
  561. END_OF_FILE
  562. if test 2880 -ne `wc -c <'bdaymesg'`; then
  563.     echo shar: \"'bdaymesg'\" unpacked with wrong size!
  564. fi
  565. # end of 'bdaymesg'
  566. fi
  567. echo shar: End of archive 1 \(of 1\).
  568. cp /dev/null ark1isdone
  569. MISSING=""
  570. for I in 1 ; do
  571.     if test ! -f ark${I}isdone ; then
  572.     MISSING="${MISSING} ${I}"
  573.     fi
  574. done
  575. if test "${MISSING}" = "" ; then
  576.     echo You have the archive.
  577.     rm -f ark[1-9]isdone
  578. else
  579.     echo You still need to unpack the following archives:
  580.     echo "        " ${MISSING}
  581. fi
  582. ##  End of shell archive.
  583. exit 0
  584.  
  585.